package hw_8_1.reflect_Demo4;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

/**
 * 反射机制获取泛型类型
 */
public class GenericTest {
    private Map<String,Double> score;

    public static void main(String[] args) throws Exception {
        Class<GenericTest> clazz = GenericTest.class;
        Field f = clazz.getDeclaredField("score");
        /**
         * getType()方法是java.lang.reflect.Field类中的方法，用于获取字段的类型
         * 如果字段是一个参数化类型（比如List<String>），则返回的是其擦除类型（即去掉泛型参数后的类型）的Class对象。
         */
        Class<?> a = f.getType();
        System.out.println("score的类型是：" + a);
        /**
         * getGenericType()方法用于获取字段的完整泛型类型，包括泛型参数。
         * 如果字段的类型是参数化类型（如List<String>），则返回的是字段的完整泛型类型，即ParameterizedType对象。
         */
        Type gType = f.getGenericType();
        if (gType instanceof ParameterizedType){
            ParameterizedType pType = (ParameterizedType) gType;
            //调用getRawType方法获取到原始类型，即不包含泛型参数的类型
            Type rType = pType.getRawType();
            System.out.println("原始类型是：" + rType);
            /**
             * getActualTypeArguments()方法是在ParameterizedType接口中定义的方法，用于获取参数化类型的实际类型参数。
             * 该方法返回的是一个Type[]数组，包含了参数化类型的实际类型参数。
             */
            Type[] tArgs = pType.getActualTypeArguments();
            System.out.println("泛型类型是：");
            for (int i = 0; i < tArgs.length; i++) {
                System.out.println("第" + (i + 1) + "个泛型类型是：" + tArgs[i]);
            }
        } else {
            System.out.println("获取泛型类型出错！");
        }
    }
}
